// Copyright Epic Games, Inc. All Rights Reserved. // 版权声明，版权所有归 Epic Games, Inc.

#include "AbilitySystem/LyraAbilityTagRelationshipMapping.h" // 包含对应的头文件


#include UE_INLINE_GENERATED_CPP_BY_NAME(LyraAbilityTagRelationshipMapping) // 包含由 UHT 生成的 inline 代码，用于优化编译

/**
 * 给定一组技能标签，解析标签关系并填充要阻塞和取消的标签
 * @param AbilityTags 输入的技能标签容器
 * @param OutTagsToBlock 输出参数，指向要阻塞的标签容器
 * @param OutTagsToCancel 输出参数，指向要取消的标签容器
 */
void ULyraAbilityTagRelationshipMapping::GetAbilityTagsToBlockAndCancel(const FGameplayTagContainer& AbilityTags, FGameplayTagContainer* OutTagsToBlock, FGameplayTagContainer* OutTagsToCancel) const
{
	// Simple iteration for now // 目前使用简单迭代
	for (int32 i = 0; i < AbilityTagRelationships.Num(); i++) // 遍历 AbilityTagRelationships 数组
	{
		const FLyraAbilityTagRelationship& Tags = AbilityTagRelationships[i]; // 获取当前索引处的关系结构引用
		if (AbilityTags.HasTag(Tags.AbilityTag)) // 检查输入的 AbilityTags 是否包含当前关系结构中的 AbilityTag
		{
			if (OutTagsToBlock) // 检查 OutTagsToBlock 指针是否有效
			{
				OutTagsToBlock->AppendTags(Tags.AbilityTagsToBlock); // 将当前关系结构中的 AbilityTagsToBlock 追加到输出容器
			}
			if (OutTagsToCancel) // 检查 OutTagsToCancel 指针是否有效
			{
				OutTagsToCancel->AppendTags(Tags.AbilityTagsToCancel); // 将当前关系结构中的 AbilityTagsToCancel 追加到输出容器
			}
		}
	}
}

/**
 * 给定一组技能标签，添加额外的必需和阻塞标签
 * @param AbilityTags 输入的技能标签容器
 * @param OutActivationRequired 输出参数，指向激活所需的标签容器
 * @param OutActivationBlocked 输出参数，指向激活阻塞的标签容器
 */
void ULyraAbilityTagRelationshipMapping::GetRequiredAndBlockedActivationTags(const FGameplayTagContainer& AbilityTags, FGameplayTagContainer* OutActivationRequired, FGameplayTagContainer* OutActivationBlocked) const
{
	// Simple iteration for now // 目前使用简单迭代
	for (int32 i = 0; i < AbilityTagRelationships.Num(); i++) // 遍历 AbilityTagRelationships 数组
	{
		const FLyraAbilityTagRelationship& Tags = AbilityTagRelationships[i]; // 获取当前索引处的关系结构引用
		if (AbilityTags.HasTag(Tags.AbilityTag)) // 检查输入的 AbilityTags 是否包含当前关系结构中的 AbilityTag
		{
			if (OutActivationRequired) // 检查 OutActivationRequired 指针是否有效
			{
				OutActivationRequired->AppendTags(Tags.ActivationRequiredTags); // 将当前关系结构中的 ActivationRequiredTags 追加到输出容器
			}
			if (OutActivationBlocked) // 检查 OutActivationBlocked 指针是否有效
			{
				OutActivationBlocked->AppendTags(Tags.ActivationBlockedTags); // 将当前关系结构中的 ActivationBlockedTags 追加到输出容器
			}
		}
	}
}

/**
 * 如果指定的技能标签被传入的动作标签取消，则返回 true
 * @param AbilityTags 输入的技能标签容器，代表需要检查是否被取消的技能标签
 * @param ActionTag 输入的动作标签，代表可能触发取消的动作标签
 * @return 如果 AbilityTags 中的任何标签被 ActionTag 取消，则返回 true；否则返回 false
 */
bool ULyraAbilityTagRelationshipMapping::IsAbilityCancelledByTag(const FGameplayTagContainer& AbilityTags, const FGameplayTag& ActionTag) const
{
	// Simple iteration for now // 目前使用简单迭代
	for (int32 i = 0; i < AbilityTagRelationships.Num(); i++) // 遍历 AbilityTagRelationships 数组
	{
		const FLyraAbilityTagRelationship& Tags = AbilityTagRelationships[i]; // 获取当前索引处的关系结构引用

		if (Tags.AbilityTag == ActionTag && Tags.AbilityTagsToCancel.HasAny(AbilityTags)) // 检查当前关系结构的 AbilityTag 是否等于传入的 ActionTag，并且其 AbilityTagsToCancel 包含 AbilityTags 中的任何一个标签
		{
			return true; // 如果条件满足，返回 true
		}
	}

	return false; // 遍历完所有关系后未找到匹配，返回 false
}